package store;

import org.jdom.Element;
import store.Frammento;
import exceptions.XmlException;

public class RifRicetta extends Frammento {
	private int nPorzioni;
	private Ricetta ricetta;
	
	public RifRicetta(int nPorzioni, Ricetta ricetta) {
		super();
		this.nPorzioni = nPorzioni;
		this.ricetta = ricetta;
	}
	
	public int getnPorzioni() {
		return nPorzioni;
	}
	
	public Ricetta getRicetta() {
		return ricetta;
	}

	public void setPorzioni(int porzioni) {
		this.nPorzioni = porzioni;
	}
	
	public Element toXml() {
		Element rifRicetta = new Element("rif_ricetta");
		rifRicetta.setAttribute("ricetta", ricetta.getNome());
		rifRicetta.addContent(new Element("porzioni").setText(Integer.toString(nPorzioni)));
		return rifRicetta;
	}
	
	public static RifRicetta fromXml(Element rifRicetta, boolean check) throws XmlException {
		if (rifRicetta.getName() != "rif_ricetta" || rifRicetta.getAttribute("ricetta") == null)
			throw new XmlException("L'elemento passato come parametro non rappresenta un riferimento a una ricetta");
		int porzioni = 0;
		Element porzioniEl = rifRicetta.getChild("porzioni");
		if (porzioniEl != null) porzioni = Integer.parseInt(porzioniEl.getText());
		Ricetta ricetta;
		if (check) {
			try {
				ricetta = Ricetta.fromXml(TutteRicette.getTutteRicette().getRicettaElement(rifRicetta.getAttributeValue("ricetta")), check);
			} catch (Exception e) {
				throw new XmlException(e);
			}
		} else ricetta = new Ricetta(rifRicetta.getAttributeValue("ricetta"));
		return new RifRicetta(porzioni, ricetta);
	}
	
	@Override
	public String toString() {
		return ricetta.getNome() + " per " + nPorzioni + " porzioni ";
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + nPorzioni;
		result = prime * result + ((ricetta == null) ? 0 : ricetta.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		RifRicetta other = (RifRicetta)obj;
		if (nPorzioni != other.nPorzioni) return false;
		if (ricetta == null) {
			if (other.ricetta != null) return false;
		} else if (!ricetta.equals(other.ricetta)) return false;
		return true;
	}
}
